package designPattern.composite
{
	public class CompositeMainClass
	{
		/**
		 *概述：
		 * 组合模式提供了由几个小组件创建庞大系统的强健的解决方案，组成系统的组件可以是单个的对象，也可以是
		 * 包含其他对象的容器。
		 *优点：
		 * 允许客户端通过一个共同的接口采用相同的方式处理独立的组件(叶子节点)和组合组件(组合节点)。
		 *特点：
		 * 组合模式在AS3中有特殊的作用，因为显示列表已经实现了组合模式，开发者可以利用它轻松地创建份额中复杂
		 * 的显示对象。 
		 *组成：
		 * 一个组件抽象类BaseComposite，一个独立组件(叶子节点)、一个组合组件(叶子节点)，都是继承自BaseComposite
		 */		
		public function CompositeMainClass()
		{
			var root:IBaseComponent = new Composite("root");
			
			//创建节点
			var composite_1:IBaseComponent = new Composite("composite_1");
			composite_1.add(new Leaf("leaf_1"));
			composite_1.add(new Leaf("leaf_2"));
			root.add(composite_1);
			
			//创建另一个节点
			var composite_2:IBaseComponent = new Composite("composite_2");
			composite_2.add(new Leaf("leaf_3"));
			composite_2.add(new Leaf("leaf_4"));
			composite_2.add(new Leaf("leaf_5"));
			root.add(composite_2);
			
			//添加一个叶子
			root.add(new Leaf("leaf_6"));
			
			print(root);
			
			//移除root第二个节点的第二个叶子节点
			root.getChild(2).remove(root.getChild(2).getChild(2));
			print(root);
			
			//移除整个第二个组合节点
			root.remove(root.getChild(2));
			print(root);
		}
		
		private function print(root:IBaseComponent):void
		{
			root.operate();
			trace("-----------------------");
		}
			
	}
}